package services

import "github.com/sirupsen/logrus"

//153	weekSwitch	//	星期开关     1字节8个位，1~7位分别代表星期一到星期日
//154	cycleStartTime1	//	循环开启时间1   小时（1字节）
//155		//	循环开启时间1   分钟（1字节）
//156	cycleEndTime1	//	循环关闭时间1   小时（1字节）
//157		//	循环关闭时间1   分钟（1字节）
//158	duration1	//	开启时长1    小时（1字节）
//159		//	开启时长1    分钟（1字节）
//160		//	开启时长1    秒（1字节）
//161	interval1	//	间隔时长1    小时（1字节）
//162		//	间隔时长1    分钟（1字节）
//163		//	间隔时长1    秒（1字节）
//164	fanMode1	//	风扇模式1    0 正常  1动感模式  2 跟随外界
//165	fanSpeed1	//	风扇速度1   0~100%
//166	scheduledStartTime1	//	定时开启时间1   小时（1字节）
//167		//	定时开启时间1   分钟（1字节）
//168	scheduledDuration1	//	定时开启时长1    分钟（1字节）
//169		//	定时开启时长1    秒（1字节）
//170	scheduledStartTime2	//	定时开启时间2   小时（1字节）
//171		//	定时开启时间2  分钟（1字节）
//172	scheduledDuration2	//	定时开启时长2    分钟（1字节）
//173		//	定时开启时长2    秒（1字节）
//174	weekSwitch1	//	星期开关     1字节8个位，1~7位分别代表星期一到星期日
//175	mistCycleRefillTime	//	雾化循环补水时间 分钟
//176	humidityLowerLimit	//	湿度模式下限
//177	humidityUpperLimit	//	湿度模式上限
//178	autoModeSwitch	//	自动模式开关
//179	fanControlRegister	//	风扇控制寄存器
//180	coolingMode	//	降温模式
//181	postSprayVentDuration	//	喷淋停止后通风   分钟
var FanCtrlTParamsMap = map[string]DataRule{
	"weekSwitch":            {StartAddr: 153, Length: 1},
	"cycleStartTime1":       {StartAddr: 154, Length: 2},
	"cycleEndTime1":         {StartAddr: 156, Length: 2},
	"duration1":             {StartAddr: 158, Length: 3},
	"interval1":             {StartAddr: 161, Length: 3},
	"fanMode1":              {StartAddr: 164, Length: 1},
	"fanSpeed1":             {StartAddr: 165, Length: 1},
	"scheduledStartTime1":   {StartAddr: 166, Length: 2},
	"scheduledDuration1":    {StartAddr: 168, Length: 2},
	"scheduledStartTime2":   {StartAddr: 170, Length: 2},
	"scheduledDuration2":    {StartAddr: 172, Length: 2},
	"weekSwitch1":           {StartAddr: 174, Length: 1},
	"mistCycleRefillTime":   {StartAddr: 175, Length: 1},
	"humidityLowerLimit":    {StartAddr: 176, Length: 1},
	"humidityUpperLimit":    {StartAddr: 177, Length: 1},
	"autoModeSwitch":        {StartAddr: 178, Length: 1},
	"fanControlRegister":    {StartAddr: 179, Length: 1},
	"coolingMode":           {StartAddr: 180, Length: 1},
	"postSprayVentDuration": {StartAddr: 181, Length: 1},
}

type FanCtrlTParams struct {
	WeekSwitch            uint8  `json:"weekSwitch"`
	CycleStartTime1       string `json:"cycleStartTime1"`
	CycleEndTime1         string `json:"cycleEndTime1"`
	Duration1             string `json:"duration1"`
	Interval1             string `json:"interval1"`
	FanMode1              uint8  `json:"fanMode1"`
	FanSpeed1             uint8  `json:"fanSpeed1"`
	ScheduledStartTime1   string `json:"scheduledStartTime1"`
	ScheduledDuration1    string `json:"scheduledDuration1"`
	ScheduledStartTime2   string `json:"scheduledStartTime2"`
	ScheduledDuration2    string `json:"scheduledDuration2"`
	MistCycleRefillTime   uint8  `json:"mistCycleRefillTime"`
	HumidityLowerLimit    uint8  `json:"humidityLowerLimit"`
	HumidityUpperLimit    uint8  `json:"humidityUpperLimit"`
	AutoModeSwitch        uint8  `json:"autoModeSwitch"`
	FanControlRegister    uint8  `json:"fanControlRegister"`
	CoolingMode           uint8  `json:"coolingMode"`
	PostSprayVentDuration uint8  `json:"postSprayVentDuration"`
}

// 事件类型，用于组装命令
type FanCtrlTEvent struct {
	Method string         `json:"method"`
	Params FanCtrlTParams `json:"params"`
}

// 组装并发送命令给设备
func AssembleFanCtrlTPayload(mac string, method string, params map[string]interface{}) error {
	var byteList []ByteData
	for k, v := range params {
		logrus.Info("k:", k, "v:", v)
		if dataRule, ok := FanCtrlTParamsMap[k]; ok {
			byteList = append(byteList, ByteData{
				StartAddr: dataRule.StartAddr,
				Length:    dataRule.Length,
				Value:     v,
			})
		}
	}
	logrus.Info("Unsorted byteList:", byteList)
	err := AssembleCommandPayloadByByteData(mac, method, byteList)
	return err
}
